<?php
/**
 * Service_Essence
 *
 * Класс Service_Essence осуществляет работу с типами сущностей (ID, имя)
 *
 * @author Дмитий Кузьма <kouzma.d@gmail.com>
 * @author Гринько Виталий <perlaws@gmail.com>*
 * @version 2.0
 */
class Service_Essence extends ActiveRecord {

	public $tableName = 'essence_type';
	public $pkName = 'ID_essence_type';
	public $users = null;

  public function __construct($arrInitialFields = null) {
		parent::__construct($arrInitialFields);
		$this->users = new HasMany(array('className' => 'User_User', 'throw' => 'administration'));
  }

  /**
   * Получение имени сущности по идентификатору
   *
   * @param int $essenceNumber
   * @return string
   */
  public static function getEssenceTypeName($essenceType) {
    if (is_numeric($essenceType)) return self::getEssenceTypeNameById($essenceType);
    elseif (!is_string($essenceType)) throw new Exception('Invalid input numeric / string value type entity');
    if (self::isEssenceTypeNameCorrect($essenceType)) return $essenceType;
    else return false;
  }

  /**
   * Метод получает объект нужного типа. Объект будет сразу наполнен информацией, если передать id. Если этого делать не нужно, передайте null
   *
   * @param mixed $essenceType
   * @param integer $id
   * @return unknown
   */
  public static function getObjByID($essenceType, $essenceId = null) {
    $essenceType = self::getEssenceTypeID($essenceType);
    switch ($essenceType) {
  		case 2: case 'user': return new User_User($essenceId);
  		case 3: case 'typical_page': return new TypicalPage($essenceId);
  		case 4: case 'guide': return new User_Guide($essenceId);
    }
  }

  /**
   * Получение имени сущности по идентификатору
   *
   * @param int $essenceNumber
   * @return string
   */
  public static function getEssenceTypeNameById($essenceNumber) {
    switch ($essenceNumber) {
    	case 1:
        return 'administration';
  		case 2:
  			return 'user';
  		case 3:
  			return 'typical_page';
  		case 4:
  			return 'guide';
			case 9:
        return 'album';
      case 10:
        return 'photo';
      case 11:
        return 'comment';
      case 12:
        return 'map';
      case 13:
        return 'map_point';
      case 14:
        return 'message';
      case 15:
        return 'language';
      case 16:
        return 'article';
      case 17:
        return 'moderate';
      case 18:
        return 'invite';
      case 19:
        return 'invited';
      case 20:
        return 'user';
      case 21:
      	return 'text';
      case 22:
      	return 'video';
			case 23:
				return 'object_info';
			case 24:
				return 'table';
			case 25:
				return 'review';
			case 26:
				return 'country';
			case 27:
				return 'city';
			case 28:
				return 'order';
			case 29:
				return 'poll';
			case 30:
				return 'news';
			case 32:
				return 'faq';
			case 33:
				return 'faq_category';
			case 34:
				return 'company';
			case 35:
				return 'alert';
			case 36:
				return 'passenger';
			case 37:
				return 'train_ticket';
			case 38:
				return 'train';
			case 39:
				return 'delivery';
  		default:
  		  return false;
  		  throw new Exception('Invalid input numeric / string value type entity');
  	}
  }

  /**
   * Получение идентификатора сущности по любому параметру
   *
   * @param mixed $essenceType
   * @return int
   */
  public static function getEssenceTypeID($essenceType) {
    if (is_string($essenceType)) return intval(self::getEssenceTypeIDByName($essenceType));
    elseif (!is_numeric($essenceType)) throw new Exception('Invalid input numeric / string value type entity');
    if (self::isEssenceTypeIdCorrect($essenceType)) return $essenceType;
    else return false;
  }

  /**
   * Метод проверяет, корректно ли указан идентификатор типа сущности
   *
   * @param integer $essenceTypeId
   * @return boolean
   */
  public static function isEssenceTypeIDCorrect($essenceTypeId) {
    return self::getEssenceTypeNameById($essenceTypeId) ? true : false;
  }

  /**
   * Метод проверяет, корректно ли указан идентификатор типа сущности
   *
   * @param integer $essenceTypeId
   * @return boolean
   */
  public static function isEssenceTypeNameCorrect($essenceTypeName) {
    return self::getEssenceTypeIDByName($essenceTypeName) ? true : false;
  }

  /**
   * Метод проверяет, является ли этот тип сущности блоком
   *
   * @param string $essenceTypeName
   */
  public static function isItBlockEssenceTypeName($essenceTypeName) {
    switch ($essenceTypeName) {
      case 'text': case 'video': case 'album': case 'table': case 'map': return true;
      default: return false;
    }
  }
  /**
   * Получение идентификатора сущности по имени
   *
   * @param string $essenceName
   * @return int
   */
  public static function getEssenceTypeIDByName($essenceName) {
    switch ($essenceName) {
      case 'administration':
        	return 1;
  		case 'user':
  		    return 2;
  		case 'typical_page':
  		    return 3;
  		case 'guide':
  		    return 4;
			case 'album':
        return 9;
      case 'photo':
        return 10;
      case 'comment':
        return 11;
      case 'map':
        return 12;
      case 'map_point':
        return 13;
      case 'message':
        return 14;
      case 'language':
        return 15;
      case 'article':
        return 16;
      case 'moderate':
        return 17;
      case 'invite':
        return 18;
      case 'invited':
        return 19;
      case 'user':
      	return 20;
      case 'text':
      	return 21;
      case 'video':
      	return 22;
      case 'object_info':
      	return 23;
      case 'table':
      	return 24;
      case 'review':
      	return 25;
      case 'country':
      	return 26;
      case 'city':
      	return 27;
      case 'order':
      	return 28;
      case 'poll':
      	return 29;
      case 'faq':
      	return 30;
      case 'news':
      	return 32;
      case 'faq_category':
      	return 33;
      case 'company':
      	return 34;
      case 'alert':
      	return 35;
      case 'passenger':
      	return 36;
      case 'train_ticket':
      	return 37;
      case 'train':
      	return 38;
      case 'delivery':
      	return 39;
  		default:
  		  throw new Exception('Invalid input numeric / string value type entity');
  		  return false;
  	}
  }

  /**
   * Формирует очередной элемент массива с данными обо всех сущностях для отображения элемента управления "Star rating"
   *
   * @param array $arrEssence
   * @param int|string $type
   * @param bool $isDisabled
   * @return array
   */
  public static function makeJsonMarkArrayElement(array $arrEssence, $type, $isDisabled = false) {
    $arrStarsControlsElement = array();
    if (is_string($type))
      $type = (int)Service_Essence::getEssenceTypeID($type);
    else
      if (!is_numeric($type))
        return false;
    $arrStarsControlsElement = array(
        "disabled" => $isDisabled,
        "essenceType" => $type,
        "ID_essence" => $arrEssence['ID_' . Service_Essence::getEssenceTypeName($type)]
      );
    if (!is_null($arrEssence['average_mark']))
      $arrStarsControlsElement['selected'] = floor($arrEssence['average_mark']);
    return $arrStarsControlsElement;
  }

  /**
   * Формирует очередной элемент массива с данными обо всех сущностях для отображения элемента управления "Voting"
   *
   * @param array $arrEssence
   * @param unknown_type $type
   * @return unknown
   */
  public static function makeJsonVotingArrayElement(array $arrEssence, $type/*, $isDisabled = false*/) {
    $arrVotingControlsElement = array();
    if (is_string($type))
      $type = (int)Service_Essence::getEssenceTypeID($type);
    else
      if (!is_numeric($type))
        return false;
    $arrVotingControlsElement = array(
        /*"disabled" => $isDisabled,*/
        "essenceType" => $type,
        "ID_essence" => $arrEssence['ID_' . Service_Essence::getEssenceTypeName($type)]
      );
    return $arrVotingControlsElement;
  }
  /**
   * Проверяет, совпадает ли пользователь с автором
   *
   * @param integer $essenceType
   * @param integer $essenceID
   * @param integer $userId
   */
  public static function isAuthorTheSame($essenceType, $essenceId, $userId = null) {
    if (!$userId) {
      $objSession = User_Session::instance();
      $userId = $objSession->getUserId();
    }
    if (!$userId)
      return false;
    $strTable = Service_Essence::getEssenceTypeName($essenceType);
	  $objDB = Service_Database::instance();
		$stmt = "SELECT `ID_user` FROM `" . $strTable . "`
				WHERE `ID_" . $strTable . "`='" . $essenceId . "' AND `ID_user`='" . $userId . "'";
    return (sizeof($objDB->selectOne($stmt)) > 0) ? true : false;  //Осуществляем SQL-запрос
  }

  /**
   * получает автора материала
   *
   * @param integer $essenceType
   * @param integer $essenceID
   */
  public static function getAuthor($essenceType, $essenceId) {
    $strTable = Service_Essence::getEssenceTypeName($essenceType);
	  $objDB = Service_Database::instance();
		$stmt = "SELECT `ID_user` FROM `" . $strTable . "`
				WHERE `ID_" . $strTable . "`='" . $essenceId . "'";
    return $objDB->selectSimpleField($stmt);  //Осуществляем SQL-запрос
  }

  /**
   * получение имя типа страницы
   *
   */
  public static function getPageRussianImenitelniyNameByPageType($pageType, $superscript = true) {
  	switch ($pageType) {
  		case 0: return ($superscript ? 'C' : 'c') . 'татья'; break;
  		case 1: return ($superscript ? 'О' : 'о') . 'бъект'; break;
  		case 2: return ($superscript ? 'C' : 'c') . 'обытие'; break;
  		case 3: return ($superscript ? 'Т' : 'т') . 'ур'; break;
  		case 4: return ($superscript ? 'Г' : 'г') . 'ид'; break;
  		case 11: return ($superscript ? 'И' : 'и') . 'нформация о проекте'; break;
  		case 12: return ($superscript ? 'О' : 'о') . 'тдельная страница'; break;
  		case 13: return ($superscript ? 'C' : 'c') . 'татья JS банера'; break;
  		default: return ($superscript ? 'Р' : 'р') . 'азное'; break;
  	}
  }

  /**
   * получение имя типа страницы
   *
   */
  public static function getPageRussianManyNameByPageType($pageType, $superscript = true) {
  	switch ($pageType) {
  		case 0: return ($superscript ? 'C' : 'c') . 'татьи'; break;
  		case 1: return ($superscript ? 'О' : 'о') . 'бъекты'; break;
  		case 2: return ($superscript ? 'C' : 'c') . 'обытия'; break;
  		case 3: return ($superscript ? 'Т' : 'т') . 'уры'; break;
  		case 4: return ($superscript ? 'Г' : 'г') . 'иды'; break;
  		case 11: return ($superscript ? 'И' : 'и') . 'нформация о проекте'; break;
  		case 12: return ($superscript ? 'О' : 'о') . 'тдельные страницы'; break;
  		case 13: return ($superscript ? 'C' : 'c') . 'татьи JS банера'; break;
  		default: return ($superscript ? 'Р' : 'р') . 'азное'; break;
  	}
  }

  /**
   * получение имя типа страницы
   *
   */
  public static function getPageRussianHZ3NameByPageType($pageType, $superscript = true) {
  	switch ($pageType) {
  		case 0: return ($superscript ? 'C' : 'c') . 'татьи'; break;
  		case 1: return ($superscript ? 'О' : 'о') . 'бъекта'; break;
  		case 2: return ($superscript ? 'C' : 'c') . 'обытия'; break;
  		case 3: return ($superscript ? 'Т' : 'т') . 'ур'; break;
  		case 4: return ($superscript ? 'Г' : 'г') . 'ида'; break;
  		case 11: return ($superscript ? 'И' : 'и') . 'нформации о проекте'; break;
  		case 12: return ($superscript ? 'О' : 'о') . 'тдельной страницы'; break;
  		case 13: return ($superscript ? 'C' : 'c') . 'татьи JS банера'; break;
  		default: return ($superscript ? 'Р' : 'р') . 'азное'; break;
  	}
  }

  /**
   * получение имя типа страницы
   *
   */
  public static function getPageRussianHZNameByPageType($pageType, $superscript = false) {
  	switch ($pageType) {
  		case 0: return ($superscript ? 'C' : 'c') . 'татью'; break;
  		case 1: return ($superscript ? 'О' : 'о') . 'бъект'; break;
  		case 2: return ($superscript ? 'C' : 'c') . 'обытие'; break;
  		case 3: return ($superscript ? 'Т' : 'т') . 'ур'; break;
  		case 4: return ($superscript ? 'Г' : 'г') . 'гида'; break;
  		case 11: return ($superscript ? 'И' : 'и') . 'нформацию о проекте'; break;
  		case 13: return ($superscript ? 'П' : 'п') . 'редложение'; break;
  		default: return ($superscript ? 'Р' : 'р') . 'азное'; break;
  	}
  }

  /**
   * получение имя типа страницы
   *
   */
  public static function getPageRussianHZ2NameByPageType($pageType, $superscript = false) {
  	switch ($pageType) {
  		case 0: return ($superscript ? 'С' : 'с') . 'татей'; break;
  		case 1: return ($superscript ? 'О' : 'о') . 'бъектов'; break;
  		case 2: return ($superscript ? 'С' : 'с') . 'обытий'; break;
  		case 3: return ($superscript ? 'Т' : 'т') . 'ур'; break;
  		case 4: return ($superscript ? 'Г' : 'г') . 'ида'; break;
  		case 11: return ($superscript ? 'И' : 'и') . 'нформации о проекте'; break;
			case 12: return ($superscript ? 'О' : 'о') . 'тдельных страниц'; break;
			case 13: return ($superscript ? 'С' : 'с') . 'татей JS банера'; break;
  		default: return ($superscript ? 'Р' : 'р') . 'азное'; break;
  	}
  }

  /**
   * получение имя типа страницы
   *
   */
  public static function getNameByPageType($pageType, $superscript = false, $userPart = false) {
  	switch ($pageType) {
  		case 0: return ($superscript ? 'A' : 'a') . 'rticle' . ($userPart ? 's' : ''); break;
  		case 1: return ($superscript ? 'G' : 'g') . 'uides' . ($userPart ? 's' : ''); break;
  		case 2: return ($superscript ? 'E' : 'e') . 'vent' . ($userPart ? 's' : ''); break;
  		case 3: return ($superscript ? 'S' : 's') . 'ervice' . ($userPart ? 's' : ''); break;
  		case 4: return ($superscript ? 'G' : 'g') . 'uide' . ($userPart ? 's' : ''); break;
  		case 11: return ($superscript ? 'P' : 'p') . 'rojects' . ($userPart ? 's' : ''); break;
  		case 12: return ($superscript ? 'I' : 'i') . 'ndividual' . ($userPart ? 's' : ''); break;
  		case 13: return ($superscript ? 'O' : 'o') . 'ffer' . ($userPart ? 's' : ''); break;
  		default: return ($superscript ? 'S' : 's') . 'tandard' . ($userPart ? 's' : ''); break;
  	}
  }


  /**
   * получение имя типа страницы
   *
   */
  public static function getPageTypeByPageTypeName($pageTypeName) {
  	switch ($pageTypeName) {
  		case 'article': return 0; break;
  		case 'guide': return 1; break;
  		case 'guides': return 1; break;
  		case 'event': return 2; break;
  		case 'service': return 3; break;
  		case 'head':case 'project': return 11; break;
  		case 'individual': return 12; break;
  		case 'offer': return 13; break;
  	}
  }

  /**
   * получение имя рутового раздела
   *
   */
  public static function getRootByPageType($pageType) {
  	switch ($pageType) {
  		//case 0: return 'Статьи и обзоры'; break;
  		case 0: return 'Статьи'; break;
  		case 1: return 'Гид по Петербургу'; break;
  		case 2: return 'События Петербурга'; break;
  		case 3: return 'Услуги'; break;
  		case 9: return 'Фотогалерея'; break;
  		case 11: return 'Информация о проекте'; break;
  		case 13: return 'Предложения'; break;
  		case 14: return 'Редакторы'; break;
  		default: return 'Разное'; break;
  	}
  }

  /**
   * получение имя раздела
   *
   */
  public static function getEssenceHaderByID($pageType) {
  	switch ($pageType) {
  		//case 0: return 'Статьи и обзоры'; break;
  		case 0: return 'Статьи'; break;
  		case 1: return 'Гид по Петербургу'; break;
  		case 2: return 'События Петербурга'; break;
  		case 3: return 'Услуги'; break;
  		case 9: return 'Фотогалерея'; break;
  		case 11: return 'Информация о проекте'; break;
  		case 13: return 'Предложения'; break;
  		case 14: return 'Редакторы'; break;
  		default: return 'Разное'; break;
  	}
  }

	/**
	 * Инкремент поля для сущности
	 *
	 * @param string $essenceName - Имя сущности
	 * @param int $essenceId - ID сущности
	 * @param string $columnName - поле для инкремента
	 * @return unknown
	 */
  public static function incrementColumnInEssecnce($essenceName, $essenceId, $columnName, $count = 1) {
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `" . $essenceName . "` SET `" . $essenceName . "`.`" . $columnName . "` = (`" . $essenceName . "`.`" . $columnName . "` + " . $count . ")
		WHERE `" . $essenceName . "`.`ID_" . $essenceName . "` = '" . $essenceId . "'";
		
		$res = $objDB->query($stmt);
		return $res;
	}

	/**
	 * Декремент поля для сущности
	 *
	 * @param string $essenceName - Имя сущности
	 * @param int $essenceId - ID сущности
	 * @param string $columnName - поле для декремента
	 * @return unknown
	 */
  public static function decrementColumnInEssecnce($essenceName, $essenceId, $columnName, $count = 1) {
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `" . $essenceName . "` SET `" . $essenceName . "`.`" . $columnName . "` = (`" . $essenceName . "`.`" . $columnName . "` - " . $count . ")
		WHERE `" . $essenceName . "`.`ID_" . $essenceName . "` = '" . $essenceId . "'";
		return $objDB->query($stmt);
	}

}
?>